<?php

	
	// process file upload
	class qqFileUploader {
		private $allowedExtensions = array();
		private $sizeLimit = 10485760;
		private $file;
		private $time;
		private $dir;
		
		function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760,$time = ''){
			$allowedExtensions = array_map("strtolower", $allowedExtensions);
	
			$this->allowedExtensions = $allowedExtensions;
			$this->sizeLimit = $sizeLimit;
	
			$this->checkServerSettings();
	
			if (isset($_GET['qqfile'])) {
				$this->file = new qqUploadedFileXhr();
			} elseif (isset($_FILES['qqfile'])) {
				$this->file = new qqUploadedFileForm();
			} else {
				$this->file = false;
			}
			$this->time = $time ? $time : time();
		}
	
		public function getName(){
			if ($this->file)
				return $this->file->getName();
		}
	
		private function checkServerSettings(){
			$postSize = $this->toBytes(ini_get('post_max_size'));
			$uploadSize = $this->toBytes(ini_get('upload_max_filesize'));
	
			if ($postSize < $this->sizeLimit || $uploadSize < $this->sizeLimit){
				$size = max(1, $this->sizeLimit / 1024 / 1024) . 'M';
				die("{'error':'increase post_max_size and upload_max_filesize to $size'}");
			}
		}
	
		private function toBytes($str){
			$val = trim($str);
			$last = strtolower($str[strlen($str)-1]);
			switch($last) {
				case 'g': $val *= 1024;
				case 'm': $val *= 1024;
				case 'k': $val *= 1024;
			}
			return $val;
		}
	
		/**
		 * Returns array('success'=>true) or array('error'=>'error message')
		 */
		function handleUpload( $replaceOldFile = FALSE){
			if (!is_writable($this->dir)){
				return array('error' => "Server error. Upload directory isn't writable.");
			}
	
			if (!$this->file){
				return array('error' => 'No files were uploaded.');
			}
	
			$size = $this->file->getSize();
	
			if ($size == 0) {
				return array('error' => 'File is empty');
			}
	
			if ($size > $this->sizeLimit) {
				return array('error' => 'File is too large');
			}
	
			$pathinfo = pathinfo($this->file->getName());
			$filename = $pathinfo['filename'];
			//$filename = md5(uniqid());
			$ext = @$pathinfo['extension'];		// hide notices if extension is empty
	
			if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){
				$these = implode(', ', $this->allowedExtensions);
				return array('error' => 'File has an invalid extension, it should be one of '. $these . '.');
			}
	
			if(!$replaceOldFile){
				/// don't overwrite previous files that were uploaded
				while (file_exists($this->dir . $filename . '.' . $ext)) {
					$filename .= rand(10, 99);
				}
			}
	
			if ($this->file->save($this->dir . $filename . '.' . $ext)){
				return array('success'=>true);
			} else {
				return array('error'=> 'Could not save uploaded file.' .
						'The upload was cancelled, or server error encountered');
			}
	
		}
		
		//设置并创建文件具体存放的目录
		//$basedir  : 基目录，必须为物理路径
		//$filedir  : 自定义子目录，可用参数{y}、{m}、{d}
		function set_dir($basedir,$filedir = '') {
			$dir = $basedir;
			if(!file_exists($dir)){
				mkdir($dir,0777);
			}
			 
			if(!empty($filedir)){
				$filedir = str_replace(array('{y}','{m}','{d}'),array(date('Y',$this->time),date('m',$this->time),date('d',$this->time)),strtolower($filedir));
				$dirs = explode('/',$filedir);
				foreach ($dirs as $d){
					!empty($d) && $dir .= $d.'/';
					!is_dir($dir) && @mkdir($dir,0777);
				}
			}
			$this->dir = $dir;
		}
		
		function get_dir(){
			return $this->dir;
		}
	}
	
	
	/**
	 * Handle file uploads via XMLHttpRequest
	 */
	class qqUploadedFileXhr {
		/**
		 * Save the file to the specified path
		 * @return boolean TRUE on success
		 */
		function save($path) {
			$input = fopen("php://input", "r");
			$temp = tmpfile();
			$realSize = stream_copy_to_stream($input, $temp);
			fclose($input);
	
			if ($realSize != $this->getSize()){
				return false;
			}
	
			$target = fopen($path, "w");
			fseek($temp, 0, SEEK_SET);
			stream_copy_to_stream($temp, $target);
			fclose($target);
	
			return true;
		}
		function getName() {
			return $_GET['qqfile'];
		}
		function getSize() {
			if (isset($_SERVER["CONTENT_LENGTH"])){
				return (int)$_SERVER["CONTENT_LENGTH"];
			} else {
				throw new Exception('Getting content length is not supported.');
			}
		}
	}
	
	/**
	 * Handle file uploads via regular form post (uses the $_FILES array)
	 */
	class qqUploadedFileForm {
		/**
		 * Save the file to the specified path
		 * @return boolean TRUE on success
		 */
		function save($path) {
			if(!move_uploaded_file($_FILES['qqfile']['tmp_name'], $path)){
				return false;
			}
			return true;
		}
		function getName() {
			return $_FILES['qqfile']['name'];
		}
		function getSize() {
			return $_FILES['qqfile']['size'];
		}
	}
?>